home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / Plotting / NXplot3d.3.2 / demproc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-12  |  4.2 KB  |  183 lines

  1. /* DEMPROC.C Copyright 1994 Steve Ludtke */
  2. /* This program reads a DEM (digital elevation model) file and writes it */
  3. /* in a more compact easier to search form (pdem) for use with NXPlot3d  */
  4.  
  5. #include<stdio.h>
  6. #include<math.h>
  7.  
  8. float flread(char *s,int *p);
  9.  
  10. int blmode;        // if 0 fixed length mode, if 1 variable length mode
  11.  
  12. main(int argc,char *argv[])
  13. {
  14. char s[10241];
  15. int i,j,jj,k,l,m,p,nx,ny;
  16. short h[20];
  17. float a,b,c,xm[2],ym[3],zm[2];
  18. FILE *in,*out;
  19.  
  20. if (argc!=3) { printf("demproc <infile>.dem <outfile>.pdem\n"); exit(0); }
  21. in=fopen(argv[1],"r");
  22. if (in==NULL) { printf("Can't open input file\n"); exit(0); }
  23.  
  24. out=fopen(argv[2],"w");
  25. if (out==NULL) { printf("Can't open output file\n"); exit(0); }
  26.  
  27. fread(s,1024,1,in);
  28. for (i=0; i<1024; i++) if (s[i]=='\n') break;
  29. if (i==1024) {
  30.     blmode=0; 
  31.     printf("This is a fixed record length DEM\n");
  32. }
  33. else {
  34.     blmode=1;
  35.     printf("This is a variable record length DEM\n");
  36. }
  37.  
  38. rewind(in);
  39. if (blmode) fgets(s,10240,in); else fread(s,1024,1,in);
  40.  
  41. sscanf(&s[0x214],"%d %d %d",&i,&j,&k);
  42. if (i!=3) printf("Unknown units. Expected arc-seconds, got %d\n",i);
  43. else printf("x/y units are arc-seconds\n");
  44. if (j==2) printf("z units are meters\n");
  45. else if (j==1) printf("z units are feet\n");
  46. else printf("Unknown units. Expected meters=2 or feet=1, got %d\n",j);
  47. if (k!=4) printf("Bad polygon. I expected 4, I got %d\n",k);
  48.  
  49. p=0x223;
  50. a=flread(s,&p);
  51. b=flread(s,&p);
  52. xm[0]=a/3600.0;
  53. ym[0]=b/3600.0;
  54.  
  55. a=flread(s,&p);
  56. b=flread(s,&p);
  57. a=flread(s,&p);
  58. b=flread(s,&p);
  59. xm[1]=a/3600.0;
  60. ym[1]=b/3600.0;
  61.  
  62. a=flread(s,&p);
  63. b=flread(s,&p);
  64. a=flread(s,&p);
  65. b=flread(s,&p);
  66. printf("The elevations in this file vary from %f to %f\n",a,b);
  67. zm[0]=a;
  68. zm[1]=b;
  69.  
  70. printf("This map covers an area from %f,%f to %f,%f\n",xm[0],ym[0],xm[1],ym[1]);
  71.  
  72. sscanf(&s[0x358]," %d %d",&i,&j);
  73. printf("There are %dX%d profiles in this file\n",i,j);
  74. nx=j;
  75. if (i!=1) { printf("I only know how to read 1Xn files. Sorry\n"); exit(0); }
  76.  
  77. printf("Pass 1, check row count limits\n");
  78. for (i=ny=0; i<nx; i++) {
  79.     if (blmode) fgets(s,10240,in); else fread(s,1024,1,in);
  80.     sscanf(s," %d %d %d %d%n",&j,&j,&jj,&k,&p);
  81.     a=flread(s,&p);
  82.     a=flread(s,&p);
  83.     a=flread(s,&p);
  84.     a=flread(s,&p);
  85.     a=flread(s,&p);
  86.     if (jj>ny) {
  87.         ny=jj;
  88.         printf("Scan row %d, %d points\n",i,jj);
  89.     }
  90.     if (k!=1) { 
  91.         printf("\nHmm, I can't process %d rows per col\n",k); 
  92.         s[1024]=0;
  93.         puts(s);
  94.         exit(0); 
  95.     }
  96.  
  97.     k=(jj*6+p)/1024;
  98.     if (blmode) { for (j=0; j<k; j++) fgets(&s[strlen(s)],1024,in); }
  99.     else fread(&s[1024],1024,k,in);
  100. }
  101.  
  102. fwrite(&nx,4,1,out);    /* write 32 byte file header */
  103. fwrite(&ny,4,1,out);
  104. fwrite(xm,4,2,out);
  105. fwrite(ym,4,2,out);
  106. fwrite(zm,4,2,out);
  107. ym[2]=(ym[1]-ym[0])/(float)(ny-1);
  108.  
  109. rewind(in);
  110. if (blmode) fgets(s,10240,in); else fread(s,1024,1,in);
  111.  
  112. printf("Pass 2, convert data\n");
  113. for (i=m=0; i<nx; i++) {
  114.     if (blmode) fgets(s,10240,in); else fread(s,1024,1,in);
  115.     sscanf(s," %d %d %d %d%n",&j,&j,&jj,&k,&p);
  116.     p++;
  117.     b=flread(s,&p);
  118.     a=flread(s,&p)/3600.0;
  119.     b=flread(s,&p);
  120.     b=flread(s,&p);
  121.     b=flread(s,&p);
  122.     printf("Scan row %d, %d points\r",i,jj);
  123.     fflush(stdout);
  124.  
  125.     k=(jj*6+p)/1024;
  126.     if (blmode) { for (j=0; j<k; j++) fgets(&s[strlen(s)],1024,in); }
  127.     else fread(&s[1024],1024,k,in);
  128.     s[1024*(k+1)]=0;
  129.  
  130.     // need padding Zmin data if the row is incomplete
  131.     if (ny!=jj) {
  132.         m=(a-ym[0])/ym[2];
  133.         if (jj+m>ny) m=ny-jj;
  134.         if (m<0) m=0;
  135.         printf("Scan row %d, %d/%d points incomplete, pad=%d, %f\n",i,jj,ny,m,a);
  136.         h[0]=zm[0];
  137.         for (j=0; j<m; j++) fwrite(h,2,1,out);
  138.     }
  139.     else m=0;
  140.  
  141.     for (j=0; j<jj; j+=l) {
  142.         l=sscanf(&s[p]," %hd %hd %hd %hd %hd %hd %hd %hd %hd %hd %hd %hd %hd %hd %hd %hd %hd %hd %hd %hd%n", &h[0],&h[1],&h[2],&h[3],&h[4],&h[5],&h[6],&h[7],&h[8],&h[9],&h[10],&h[11],&h[12],&h[13],&h[14],&h[15],&h[16],&h[17],&h[18],&h[19],&k); 
  143.         p+=k;
  144.         m+=l;
  145.         fwrite(h,2,l,out);
  146.     }
  147.  
  148.     // fill in Zmin for rest of row
  149.     h[0]=zm[0];
  150.     for (j=m; j<ny; j++) fwrite(h,2,1,out);
  151. }
  152.  
  153. }
  154.  
  155. float flread(char *s,int *p)
  156. {
  157. int i;
  158. char m[30],e[10];
  159. float r1,r2;
  160.  
  161. i=0;
  162. while (s[*p]!='D' && s[*p]!='E' && s[*p]!='d' && s[*p]!='e' && i<30) {
  163.     m[i++]=s[*p];
  164.     (*p)++;
  165. }
  166. if (i==30) return(0);
  167. m[i]=0;
  168. (*p)++;
  169.  
  170. e[0]=s[*p];
  171. e[1]=s[*p+1];
  172. if (s[*p]=='+' || s[*p]=='-') {
  173.     e[2]=s[*p+2];
  174.     e[3]=0;
  175.     (*p)+=3;
  176. }
  177. else { e[3]=0; (*p)+=2; }
  178.  
  179. sscanf(m," %f",&r1);
  180. sscanf(e," %f",&r2);
  181. return(r1*pow(10.0,r2));
  182. }
  183.